package main

// 标准包 time

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println("标准时间包time的使用")
	now := time.Now()
	year := now.Year()
	month := now.Month()
	day := now.Day()
	hour := now.Hour()
	minute := now.Minute()
	second := now.Second()

	fmt.Println(now, year, month, day, hour, minute, second)

	// 时间戳 1970年1月1日 00:00:00 UTC 至当前时间经过的总秒数
	timestamp := now.Unix()           // 秒
	secondTimeStamp := now.UnixNano() // 毫秒

	fmt.Println("当前秒级时间戳是: ", timestamp)
	fmt.Println("当前毫秒级时间戳是: ", secondTimeStamp)

	// 将时间戳转为时间格式
	t := time.Unix(1658740446, 0)
	fmt.Println(t)

	// 时间间隔 单位是纳秒
	//time.Sleep(5 * time.Second) // 这样是5秒
	//// 如果想要按照定义的时间
	//n := 10
	//time.Sleep(time.Duration(n) * time.Second) // 需要这么写
	//fmt.Println("执行完成. ")

	// 时间操作
	// 1小时之后的时间  add 参数时间间隔
	t2 := now.Add(time.Hour)
	fmt.Println(now)
	fmt.Println(t2)
	// 求两个时间差 sub 参数是时间
	t3 := time.Date(2020, 11, 14, 16,
		45, 16, 36, time.UTC)
	u := time.Date(2019, 9, 5, 18, 0,
		0, 0, time.UTC)

	// Calling Sub method
	subtract := t3.Sub(u)
	fmt.Println(subtract)

	// 定时器 返回是一个channel
	//for tmp := range time.Tick(time.Second * 2) {
	//	fmt.Println(tmp)
	//}

	// 时间格式化
	/*
			Y m d h m s
		2006 01 02 15 04 05
	*/
	result1 := now.Format("2006-01-02 15:04:05")
	fmt.Println(result1)
	result2 := now.Format("2006-01-02 03:04:05 PM")
	fmt.Println(result2)

	result3 := now.Format("2006-01-02 15:04:05.000")
	fmt.Println("result3 is : ", result3)

	timeStr := "2022/08/02 14:51:42"
	// 解析字符串类型时间 需要告诉时区和当前时间
	//先获取时区
	local, err := time.LoadLocation("Asia/Shanghai")
	if err != nil {
		fmt.Println(err)
		return
	}
	// 根据时区去判断当前时间
	timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", timeStr, local)
	if err != nil {
		fmt.Printf("parse error is %v\n", err)
		return
	}

	fmt.Println(timeObj)

	// 不获取时区
	timeObj1, err := time.Parse("2006/01/02 15:04:05", timeStr)
	if err != nil {
		fmt.Printf("parse error is %v\n", err)
		return
	}

	fmt.Println(timeObj1)
	// 统计程序运行时间
	spend := time.Since(now)
	fmt.Println(spend)
}
